#pragma once
#include "Common.hpp"

// 单例模式
class CentealCache
{
public:
    static CentealCache *GetInstance()
    {
        return &_sInst; // main之前创建
    }
    // 获取一个非空的span
    Span* GetOneSpan(SpanList& list, size_t byte_size);
    // 从中心缓存获取一定数量的对象给thread cache
    size_t FetchRangeObj(void *&start, void *&end, size_t n, size_t size);
private:
    // 在 threadcache中是几号桶，那么在对应的Span中也是几号桶
    SpanList _spanLists[NFREELIST]; // 这里有多少个桶，那就有多少个桶锁
private:
    // 不让其他人构造，构造函数私有
    CentealCache()
    {
    }
    CentealCache(const CentealCache &) = delete;
    static CentealCache _sInst;
};

// span设计成双向的链表，方便于任意位置的删除回收